home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Tool Chest / Development Tools & Languages / Macintosh Common Lisp Related / CLiCC-CodeWarrior-0.6.2 / CLiCC-CodeWarrior-0.6.2.sit / clicc-0.6.2 / doc / migration < prev    next >
Encoding:
Text File  |  1993-08-04  |  8.0 KB  |  181 lines

  1. -*-indented-text-*-
  2. --------------------------------------------------------------------------------
  3. $Header: /home3/apply/public/clicc-0.6.2a/doc/RCS/migration,v 1.7 1993/08/04 13:37:55 hk Exp $
  4.  
  5.                    Anleitung fuer die Migration 
  6.  
  7.                                von 
  8.  
  9.                       CommonLisp-Anwendungen 
  10.  
  11.                               nach
  12.  
  13.                           CommonLisp0
  14.  
  15.  
  16. $Revision: 1.7 $
  17. $Log: migration,v $
  18. # Revision 1.7  1993/08/04  13:37:55  hk
  19. # Formulierung zu eval und symbol-value geaendert, specific-eval
  20. # berichtigt.
  21. #
  22. # Revision 1.6  1993/08/04  13:07:31  hk
  23. # Kommentar zur Migration von (eval 'x) korrigiert.
  24. #
  25. # Revision 1.5  1993/07/27  16:27:58  hk
  26. # Revision Keyword hinzugefuegt
  27. #
  28. # Revision 1.4  1993/06/10  08:24:39  hk
  29. # Einfuegen undefinierter Funktionen, eval auf Quote, A-Listen Trick.
  30. #
  31. # Revision 1.3  1993/04/30  13:56:16  hk
  32. # Makroaufrufe vor Definitionen
  33. #
  34. # Revision 1.2  1992/10/05  13:53:55  hk
  35. # Erfahrungen aus der Migration von ALCSAT aus Paderborn sind eingeflossen.
  36. #
  37. # Revision 1.1  1992/09/29  10:25:13  uho
  38. # Initial revision
  39. #
  40.  
  41. Hier sollen Idee und Anmerkungen gesammelt werden, wie man am besten
  42. das Tor zu CommonLisp durchschreiten kann.
  43.  
  44.  
  45. --------------------------------------------------------------------------------
  46. Im Programm benutzte aber nicht definierte Funktionen
  47. --------------------------------------------------------------------------------
  48.    Fuer sie koennen Definitionen eingefuehrt werden, die bei
  49.    Aktivierung zur Laufzeit mit einer entsprechenden Fehlermeldung
  50.    abbrechen.
  51.    Die neueste Version von CLICC f"ugt automatisch Definitionen f"ur
  52.    nicht definierte Funktionen ein. Ein Aufruf dieser Funktionen
  53.    f"uhrt zu einem Laufzeitfehler mit Angabe der aufgerufenen Funktion
  54.    und der aktuellen Parameter.
  55.  
  56. --------------------------------------------------------------------------------
  57. Benutzung von EVAL
  58. --------------------------------------------------------------------------------
  59.    - Es ist nicht sinnvoll, in einer Standalone-Applikation EVAL zu
  60.      benutzen, da dann die Funktionsf"ahigkeit des Systems durch
  61.      Benutzereingaben beeinflu"st werden kann.
  62.  
  63.    - Wenn f"ur alle Ausdr"ucke, auf die EVAL angewendet wird, gezeigt
  64.      wird, da"s es Listen sind, deren erstes Element ein Symbol ist,
  65.      das eine Funktion benennt, dann k"onnen alle Aufrufe von EVAL
  66.      durch Aufrufe einer neuen Funktion specific-eval ersetzt werden.
  67.        (DEFUN specific-eval (e)
  68.          (APPLY (SYMBOL-FUNCTION (CAR e)) (APPLY #'specific-eval (CDR e)))).
  69.      
  70.      Zur Migration von SYMBOL-FUNCTION siehe unten.
  71.  
  72.    - Wenn EVAL auf ein Argument angewendet wird, das zu einem Symbol
  73.      evaluiert [ (EVAL arg) ], dann laesst es sich durch
  74.      (SYMBOL-VALUE arg) ersetzen.
  75.  
  76.    - Wenn eine Variable x den Wert (QUOTE <s-expr>) hat, dann l"a"st
  77.      sich (eval x) durch (cadr x) ersetzen.
  78.  
  79.    - Wenn eine Liste von Wahrheitwerten mittels AND oder OR verkn"upft
  80.      werden soll, dann kann dies nicht durch Code der Gestalt
  81.      (APPLY #'AND l) erreicht werden, da AND und OR Makros sind und
  82.      nur direkt als Operatoren verwendet werden d"urfen.
  83.      Als Ausweg w"ahlen unerfahrene Programmierer dann folgenden Code:
  84.      (EVAL `(AND ,@l)).
  85.      In diesem Fall sollte man allerdings die Standardfunktionen EVERY
  86.      und SOME verwenden. (APPLY #'AND l) = (EVERY #'IDENTITY l).
  87.  
  88. --------------------------------------------------------------------------------
  89. Anwendung von APPLY oder FUNCALL auf Symbole als Funktionsbezeichner
  90. --------------------------------------------------------------------------------
  91.    Die Funktionen APPLY und FUNCALL k"onnen in CLtL2 und in CL0 nicht
  92.    auf Symbole angewendet werden. Symbole m"ussen mit einem
  93.    "Aquivalent der Funktion SYMBOL-FUNCTION in Funktionen umgewandelt
  94.    werden. Vgl. SYMBOL-FUNCTION.
  95.    F"ur andere Lisp Funktionen, die Funktionen als Argument erhalten
  96.    (mapcar, Sequence-Funktionen), ist entsprechend vorzugehen.
  97.  
  98.    Wenn in einer Applikation vom Benutzer Symbole eingegeben werden,
  99.    die Funktionen benennen, dann erfolgt vor einem Aufruf mittels
  100.    APPLY gew"ohnlich eine "Uberpr"ufung auf die G"ultigkeit des Symbols.
  101.    Wenn die "Uberpr"ufung durch eine Abfrage der Form
  102.    (if (member sym '(sym1 sym2 ... sym_n)) (apply sym ...) (error "...")) 
  103.    erfolgt, dann kann dies einfach in folgende Form "uberf"uhrt
  104.    werden:
  105.    (let ((fun (assoc sym `((sym1 . ,#'fun1)
  106.                            (sym2 . ,#'fun2) ...
  107.                (sym_n . ,#'fun_n)))))
  108.      (if fun (apply fun ...) (error "...")))
  109.  
  110. --------------------------------------------------------------------------------
  111. Benutzung von SYMBOL-FUNCTION
  112. --------------------------------------------------------------------------------
  113.    Die Funktion SYMBOL-FUNCTION kann in CL0 nicht benutzt werden.
  114.    Stattdessen mu"s eine programmspezifische Funktion erstellt werden,
  115.    die die Umsetzung von Symbolen in die entsprechenden Funktionen
  116.    vornimmt. Das ist nur dann m"oglich, wenn bekannt ist, f"ur welche
  117.    die Umsetzung potentiell zur Laufzeit erfolgt.
  118.  
  119.    Die Umsetzung kann beispielsweise durch eine Hash-Table
  120.    erfolgen.
  121.    (setq *sym-fun-hash* (make-hash-table))
  122.    (setf (gethash '+ *sym-fun-hash*) #'+)
  123.    (setf (gethash '- *sym-fun-hash*) #'-)
  124.    (setf (gethash '* *sym-fun-hash*) #'*)
  125.    (setf (gethash '/ *sym-fun-hash*) #'/)
  126.    (defun specific-symbol-function (s) (gethash s *sym-fun-hash*))
  127.  
  128. --------------------------------------------------------------------------------
  129. Unbenannte Funktionen, Lambda-Ausdruecke
  130. --------------------------------------------------------------------------------
  131.    Unbenannte Funktionen k"onnen in CLtL2 und in CL0 nicht durch
  132.    Listen der Gestalt '(lambda (..) .. ) dargestellt werden. Sie
  133.    m"ussen durch #'(lambda (..) .. ) ersetzt werden. Es mu"s
  134.    sichergestellt werden, da"s die umbenannten Ausdr"ucke nicht als
  135.    Listen verwendet werden.
  136.  
  137. --------------------------------------------------------------------------------
  138. Ausdruecke, die im interaktivem System variabel, bei
  139. Komplettkompilation aber konstant sind.
  140. --------------------------------------------------------------------------------
  141.    Ggf. ist es sinnvoll eine abstrakte Interpretation auf dem Programm
  142.    durchzufuehren, wenn in Abhaengigkeit der Ausdruecke anderweitig
  143.    problematische Konstrukte ausgefuehrt werden. 
  144.    Z.B.:
  145.  
  146.            (defun interact-p ()
  147.              (boundp 'interpreter))
  148.                  
  149.            (if (interact-p)
  150.                (eval (read))
  151.                42) 
  152.  
  153.    Wenn bekannt ist, dass INTERPRETER ungebunden ist, liefert INTERACT-P
  154.    immer den Wert false. Das Conditional laesst sich dann zu 42 vereinfachen,
  155.    obwohl der THEN-Zweig ein nicht migrierbares Konstrukt enthaelt.
  156.  
  157. --------------------------------------------------------------------------------
  158. Aufruf von Funktionen der interaktiven Programmentwicklungsumgebung 
  159. --------------------------------------------------------------------------------
  160.    Aufrufe des Editors, das Laden von Programmen, des Debuggers usw. muessen
  161.    durch anwendungsspezifische Spezialfunktionen ersetzt werden. Ggf. ist zu 
  162.    bedenken, ob das Programm ueberhaupt sinnvoll migriert werden soll, oder 
  163.    lieber doch unter der Kontrolle eines Lisp-Systems ablaufen soll. 
  164.  
  165. --------------------------------------------------------------------------------
  166. Anwendungen ohne Hauptprogramm
  167. --------------------------------------------------------------------------------
  168.    Oft haben CL-Anwendungen zwar eine Hauptfunktion, sie wird aber nicht im
  169.    Programm, sondern vom Benutzer durch das Lisp-System aufgerufen. 
  170.    Der aufruf der Hauptfunktion muss als Top-Level-Form an die migrierte
  171.    Anwendung angehaengt werden.
  172.  
  173. --------------------------------------------------------------------------------
  174. Aufrufe von Makros vor ihrer Definition
  175. --------------------------------------------------------------------------------
  176.    Makros m"ussen vor ihrer ersten Verwendung definiert werden, da ein
  177.    Makroaufruf sonst f"alschlich wie ein Aufruf einer unbekannten
  178.    Funktion angesehen wird.
  179.    Gegebenenfalls m"ussen Makrodefinition an den Programmanfang
  180.    verschoben werden.
  181.